#include "../http/httpconn.h"               //HTTP报文 解析
#include "../epoller/epoller.h"                //epoll I/O复用
#include "../ThreadPoll/threadpoll.h"             //c++ 线程池
#include "../timer/heaptimer.h"              //定时器                  
#include "../Logg/log.h"                    //日志

//大致的流程如下
//创建监听的 fd,只有主进程负责 监听事件
//使用 监听的 fd,接收新的http事件 递交给 线程池中的线程负责
//线程负责解析 HTTP请求 解析请求报文,发送回应报文
//其中在 写+读 fd 时,需要形成类似一个回射的机制
//线程 获得EPOLLIN事件后,在设置EPOLLOUT、EPOLLONESHOT
//请求报文和回应报文几乎是同步生成,即使缓存区不够,也必须在完成一个 完整的事务后,
//      再设置EPOLLOUT,让其他的线程去解决新一轮的http请求
class WebServer
{
public:
    WebServer(int port,int trigMode,int timeoutMS,bool OptLinger,
                int threadMax,bool Openlog,int Loglevel,int LogCapacity);
    ~WebServer();
    void Start();
private:
    bool InitSock();
    void InitEventMode(int Mode);
    void AddClient(int fd,sockaddr_in addr);

    void SendError(int fd,const char * info);
    void ExtenTime(Httpconn* Client);
    void CloseCoon(Httpconn* Client);

    void DealListen();
    void DealWrite(Httpconn* Client);
    void DealRead(Httpconn* Client);

    void OnRead(Httpconn* Client);
    void OnWrite(Httpconn* Client);
    void OnProcess(Httpconn* Client);

    static int SetFdNonBlock(int fd);
private:
    unsigned short port_;            //端口
    int timeoutMS_;                  //给客户端的反应时间 ms
    bool OptLinger_;                 //优雅退出

    int ListenFd_;
    bool isClose_;

    char *srcDir_;                   //服务器资源文件夹
    static const int MAX_FD = 65536;    

    uint32_t listen_event;           //监听事件
    uint32_t coonfd_event;           //连接事件

    std::unique_ptr<HeapTime> Timer_;
    std::unique_ptr<ThreadPoll> Thredpoll_;
    std::unique_ptr<Epoller> epoller_;
    std::unordered_map<int,Httpconn> user_;         //key:fd,value: Client
};